﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Worktool.CODE_Chris.SQL_DATA;
using Worktool.CODE_Chris.Word_Schnittstelle;

namespace Worktool.CODE_Chris.Forms.Fertigungsauftrag
{
    public partial class FertigungsauftragPreMenu : Form
    {
        private List<FertigungsItem> fertigung = new List<FertigungsItem>();
        private DeliveryChain delivery;
        private Boolean isNewDataset = false;
        private String id = null;
        private SQL sql;
        private Word word;

        public FertigungsauftragPreMenu(List<FertigungsItem> fertigung, DeliveryChain delivery, Boolean isNewDataset, String id)
        {
            this.id = id;
            this.isNewDataset = isNewDataset;
            this.fertigung = fertigung;
            this.delivery = delivery;
            InitializeComponent();
            init();
        }

        private void init()
        {
            sql = new SQL();
            word = new Word();

            fillComboBox();

            if (!isNewDataset) loadData();

            setListBoxFertigung();
            setDate();
        }

        private void loadData()
        {
            try
            {
                if (id != null)
                {
                    buttonDelete.Visible = true;
                    buttonOpen.Visible = true;

                    String[,] data = sql.receiveSQL("SELECT RIGHT('000000'+CAST(ISNULL(id,'') AS NVARCHAR(6)),6) AS ID, Bemerkung, Ansprechpartner, SollFertigstellung_HH, Lagerort FROM tbl_fertigungsauftrag WHERE ID =" + Convert.ToInt32(id));
                    dateTimePicker.Value = DateTime.Parse(data[3, 0]);
                    textBoxAnsprechpartner.Text = data[2, 0];
                    richTextBox1.Text = data[1, 0];

                    Boolean isInCombo = false;
                    for (int a = 0; a < comboOrt.Items.Count; a++)
                    {
                        if (data[4, 0] == comboOrt.Items[a].ToString())
                        {
                            isInCombo = true;
                            comboOrt.Text = data[4, 0];
                            break;
                        }
                    }

                    if (!isInCombo)
                    {
                        comboOrt.Items.Add(data[4, 0]);
                        comboOrt.Refresh();
                        comboOrt.Text = data[4, 0];
                    }

                    this.Text = "Fertigungsauftrag " + data[0, 0];
                    buttonOk.Text = "Fertigungsauftrag neu erstellen";
                }
                else
                {
                    MessageBox.Show("Die ID des Fertigungsauftrags konnte nicht ermittelt werden.", "Fehler");
                    this.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler in der Methode " + this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name + "\r\n\r\nFehlerbeschreibung;\r\n" + ex.StackTrace, "Fehler");
            }
        }

        private void fillComboBox()
        {
            try
            {
                //System Combobox füllen
                comboOrt.Items.Add("Bitte auswählen");
                comboOrt.DropDownWidth = 300;
                comboOrt.DropDownHeight = 500;

                DataGridViewComboBoxCell cell = delivery.getDataGrid().Rows[1].Cells["Lagerort"] as DataGridViewComboBoxCell;
                for (int a = 0; a < cell.Items.Count; a++)
                {
                    DataRowView view = (DataRowView)cell.Items[a];
                    if (view.Row.ItemArray[1].ToString() != "") comboOrt.Items.Add(view.Row.ItemArray[1].ToString());
                }
                comboOrt.Refresh();
                comboOrt.Text = "Bitte auswählen";
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler in der Methode " + this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name + "\r\n\r\nFehlerbeschreibung;\r\n" + ex.StackTrace, "Fehler");
            }
        }

        private void setListBoxFertigung()
        {
            try
            {
                if (fertigung == null || !isNewDataset)
                {
                    //Artikel des Fertigungsauftrags laden
                    fertigung = new List<FertigungsItem>();

                    String[,] data = sql.receiveSQL("SELECT ID_MaterialDetailExtended,Manufacturer,Model,Venue,Positions_ID,JLM,wareLieferSollHH FROM vw_comm_Lieferkette a WHERE ID_MaterialDetailExtended IN (SELECT ID_MatDetailExt FROM tbl_fertigungsauftrag_matching WHERE ID_Fertigungsauftrag = " + id + ")");
                    for (int a = 0; a < data.GetLength(1); a++)
                    {
                        DateTime? soll;
                        try
                        {
                            soll = DateTime.Parse(getFertigungValue(data[6, a]));
                        }
                        catch (Exception)
                        {
                            soll = null;
                        }

                        fertigung.Add(new FertigungsItem()
                        {
                            Detail_ID = Convert.ToInt32(getFertigungValue(data[0, a])),
                            Manufacturer = getFertigungValue(data[1, a]),
                            Model = getFertigungValue(data[2, a]),
                            Venue = getFertigungValue(data[3, a]),
                            PositionsID = getFertigungValue(data[4, a]),
                            JLM = getFertigungValue(data[5, a]),
                            SollBereitstellung = soll
                        });
                    }
                }

                //Listview füllen
                foreach (FertigungsItem item in fertigung)
                {
                    ListViewItem i = listViewFertigung.Items.Add(item.Manufacturer);
                    i.SubItems.Add(item.Model);
                    i.SubItems.Add(item.Venue);
                    i.SubItems.Add(item.PositionsID);
                    i.SubItems.Add(item.JLM);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler in der Methode " + this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name + "\r\n\r\nFehlerbeschreibung;\r\n" + ex.StackTrace, "Fehler");
            }
        }

        private String getFertigungValue(String value)
        {
            if (value == null) return ""; else return value;
        }

        private void setDate()
        {
            try
            {
                if (fertigung != null || isNewDataset)
                {
                    DateTime? bereitDate = new DateTime(1900, 1, 1);
                    Boolean changed = false;

                    foreach (FertigungsItem item in fertigung)
                    {
                        if (item.SollBereitstellung != null)
                        {
                            if ((item.SollBereitstellung.HasValue && bereitDate.HasValue) && DateTime.Compare(bereitDate.Value, item.SollBereitstellung.Value) < 0)
                            {
                                changed = true;
                                bereitDate = item.SollBereitstellung;
                            }
                        }
                    }

                    if (changed) dateTimePicker.Value = (DateTime)bereitDate;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler in der Methode " + this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name + "\r\n\r\nFehlerbeschreibung;\r\n" + ex.StackTrace, "Fehler");
            }
        }

        private void buttonOk_Click(object sender, EventArgs e)
        {
            try
            {
                //Check, ob alle Werte eingetragen.
                if (textBoxAnsprechpartner.Text == "")
                {
                    MessageBox.Show("Bitte einen Ansprechpartner angeben.", "Fehler");
                }
                else if (comboOrt.Text == "" || comboOrt.Text == "Bitte auswählen")
                {
                    MessageBox.Show("Bitte einen Lagerort angeben.", "Fehler");
                }
                else
                {
                    if (isNewDataset)
                    {
                        //Fertigstellungsauftrag erstellen
                        SqlCommand insCmd = new SqlCommand("dbo.insertFertigungsauftrag");
                        insCmd.CommandType = CommandType.StoredProcedure;
                        insCmd.UpdatedRowSource = UpdateRowSource.OutputParameters;
                        insCmd.Parameters.Add("@Bemerkung", SqlDbType.NChar).Value = richTextBox1.Text;
                        insCmd.Parameters.Add("@Ansprechpartner", SqlDbType.NChar).Value = textBoxAnsprechpartner.Text;
                        insCmd.Parameters.Add("@SollFertigstellungHH", SqlDbType.Date).Value = dateTimePicker.Value.ToShortDateString();
                        insCmd.Parameters.Add("@LagerOrt", SqlDbType.NChar).Value = comboOrt.Text;

                        SqlParameter parameter = insCmd.Parameters.Add("@Identity", SqlDbType.Int, 10, "ID");
                        parameter.Direction = ParameterDirection.Output;

                        String new_ID = sql.insertNewRow(insCmd).ToString().PadLeft(6, '0');

                        if (new_ID != null)
                        {
                            id = new_ID;

                            //Daten in Matching-Tabelle schreiben
                            for (int a = 0; a < fertigung.Count; a++)
                            {
                                sql.sendSQL("INSERT INTO tbl_fertigungsauftrag_matching (ID_MatDetailExt, ID_Fertigungsauftrag) VALUES (" + fertigung[a].Detail_ID + "," + new_ID + ")");
                            }

                            //Sollbereitstellung für ausgewählte Artikel in Lieferketten-Tabelle schreiben
                            setDataGridValues();

                            generateWord();
                        }
                        else
                        {
                            MessageBox.Show("Der Datensatz konnte nicht in die Datenbank geschrieben werden. Vorgang abgebrochen. Bitte wenden Sie sich an Ihren Administrator.", "Fehler");
                        }
                    }
                    else
                    {
                        //Update des Fertigungsauftrags
                        sql.sendSQL("UPDATE tbl_fertigungsauftrag SET " +
                            "Bemerkung = '" + richTextBox1.Text + "'," +
                            "Ansprechpartner = '" + textBoxAnsprechpartner.Text + "'," +
                            "SollFertigstellung_HH = '" + dateTimePicker.Value.ToShortDateString() + "'," +
                            "Lagerort = '" + comboOrt.Text + "'" +
                            " WHERE ID = " + id
                            );

                        //Sollbereitstellung für ausgewählte Artikel in Lieferketten-Tabelle schreiben
                        setDataGridValues();

                        generateWord();
                    }

                    delivery.fillElementsInit();
                    this.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler in der Methode " + this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name+"\r\n\r\nFehlerbeschreibung;\r\n"+ex.StackTrace, "Fehler");
            }
        }

        private void generateWord()
        {
            //Check, ob Datei überhaupt existiert
            if (word.findFile("Templates\\"+Login.currentDBName+"\\MaterialFlow\\DeliveryChain\\Fertigung\\Fertigungsauftrag_TEMPLATE.doc"))
            {
                if (!word.createFertigung(id))MessageBox.Show("Fehler beim Erstellen der Word-Datei. Vorgang abgebrochen.", "Fehler");
            }
        }

        private void setDataGridValues()
        {
            try
            {
                DataGridView grid = delivery.getDataGrid();

                if (isNewDataset)
                {
                    for (int a = 0; a < grid.Rows.Count; a++)
                    {
                        if (grid.Rows[a].Cells["Fertigungsauftrag"].Value != null)
                        {
                            if (grid.Rows[a].Cells["Fertigungsauftrag"].Value.ToString() == "True")
                            {
                                grid.CurrentCell = grid.Rows[a].Cells["Lagerort"];
                                grid.CurrentCell.Value = comboOrt.Text;
                            }
                        }
                    }
                }
                else
                {
                    foreach (FertigungsItem item in fertigung)
                    {
                        for (int a = 0; a < grid.Rows.Count; a++)
                        {
                            if (grid.Rows[a].Cells["ID_MaterialDetailExtended"].Value != null)
                            {
                                if (grid.Rows[a].Cells["ID_MaterialDetailExtended"].Value.ToString() == item.Detail_ID.ToString())
                                {
                                    grid.CurrentCell = grid.Rows[a].Cells["Lagerort"];
                                    grid.CurrentCell.Value = comboOrt.Text;
                                    break;
                                }
                            }
                        }
                    }
                }

                grid.BindingContext[grid.DataSource].EndCurrentEdit();
                delivery.getHelper().updateGridView1(-1,-1);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler in der Methode " + this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name + "\r\n\r\nFehlerbeschreibung;\r\n" + ex.StackTrace, "Fehler");
            }
        }

        private void buttonAbort_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void buttonDelete_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Wollen Sie diesen Fertigungsauftrag wirklich löschen?", "Bestätigung", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                sql.sendSQL("DELETE FROM tbl_fertigungsauftrag_matching WHERE ID_Fertigungsauftrag = "+id);
                sql.sendSQL("DELETE FROM tbl_fertigungsauftrag WHERE ID = " + id);
                delivery.fillElementsInit();
                this.Close();
            }
        }

        private void buttonOpen_Click(object sender, EventArgs e)
        {
            String saveFileBasePath = "";
            if (Login.currentDBName == "Quantum") saveFileBasePath = Login.dictSettings["asc_quantum"];
            if (Login.currentDBName == "Hyperion") saveFileBasePath = Login.dictSettings["asc_hyperion"];
            if (Login.currentDBName == "Anthem") saveFileBasePath = Login.dictSettings["asc_anthem"];

            if (saveFileBasePath != "")
            {
                saveFileBasePath = saveFileBasePath + "\\" + id + "\\" + id + ".doc";
                if (File.Exists(saveFileBasePath)) System.Diagnostics.Process.Start(saveFileBasePath); else MessageBox.Show("Die Datei\r\n\r\n" + saveFileBasePath + "\r\n\r\nwurde nicht gefunden.", "Fehler");
            }
            else
            {
                if (Login.currentDBName == "Quantum") MessageBox.Show("Das in der 'asc.xml'-Datei im Tag 'asc_quantum' hinterlegte Verzeichnis ist ungültig. Bitte dort ein gültiges Verzeichnis angeben, das Tool neu starten und den Vorgang wiederholen.");
                if (Login.currentDBName == "Hyperion") MessageBox.Show("Das in der 'asc.xml'-Datei im Tag 'asc1_hyperion' hinterlegte Verzeichnis ist ungültig. Bitte dort ein gültiges Verzeichnis angeben, das Tool neu starten und den Vorgang wiederholen.");
                if (Login.currentDBName == "Anthem") MessageBox.Show("Das in der 'asc.xml'-Datei im Tag 'asc2_anthem' hinterlegte Verzeichnis ist ungültig. Bitte dort ein gültiges Verzeichnis angeben, das Tool neu starten und den Vorgang wiederholen.");
            }
        }
    }
}
